// 定义管理用户相关信息的Vuex模块
export default {
	// 为当前模块开启命名空间
	namespaced: true,

	// 模块局部state
	state: () => ({
		// 用户收货地址数组
		address: JSON.parse(uni.getStorageSync('address') || '[]'),
		// 用户已选中地址对象
		selectedAddress: JSON.parse(uni.getStorageSync('selectedAddress') || '{}'),
		// 用户登录成功的token字段
		token: uni.getStorageSync('token') || '',
		// 用户基本信息对象
		userInfo: JSON.parse(uni.getStorageSync('userInfo') || '{}'),
		// 重定向信息对象，用于登录成功后返回跳转前页面
		redirectInfo: {},
		// 控制调用my-address的弹出层点击事件
		isPopup: false
	}),

	// 模块mutations
	mutations: {
		// 定义更新收货地址的mutation
		updateAddress(state, argObj) {
			let arrlen = state.address.length
			// 1.为当前地址对象设置ID
			if (arrlen === 0) {
				// address数组中无地址对象，则ID从1开始
				argObj.id = 1
			} else {
				// 获取address数组最后一项ID并加1
				argObj.id = state.address[arrlen - 1].id + 1
			}
			// 2.为当前地址对象设置勾选状态，首先取消所有地址的勾选
			state.address.forEach(item => item.address_state = false)
			argObj.address_state = true

			// 添加完id与勾选状态即可push进数组
			state.address.push(argObj)

			// 将修改后的address数组存储至本地
			uni.setStorageSync('address', JSON.stringify(state.address))
		},

		// 定义删除地址的mutation
		removeAddress(state, argObj) {
			// 通过filter将筛选后的数组赋值给state.address
			state.address = state.address.filter(item => item.id !== argObj.id)
			// 判断所删除地址对象是否为当前选中地址对象
			if (state.selectedAddress.id === argObj.id) {
				state.selectedAddress = {}
			}
			// 将修改后的address数组存储至本地
			uni.setStorageSync('address', JSON.stringify(state.address))
			// 将修改后的地址信息对象存储至本地
			uni.setStorageSync('selectedAddress', JSON.stringify(state.selectedAddress))

		},

		// 定义用户选中的地址对象
		updateSelected(state, argObj) {
			// 修改地址勾选状态
			state.address.forEach(item => item.address_state = false)
			// 所传对象不为空对象才为其添加勾选状态
			if (JSON.stringify(argObj) !== '{}') {
				argObj.address_state = true
			}
			// 保存到已选中地址信息对象
			state.selectedAddress = argObj
			// 将修改后的地址信息对象存储至本地
			uni.setStorageSync('selectedAddress', JSON.stringify(state.selectedAddress))
		},

		// 定义更新token的mutation
		updateToken(state, argObj) {
			state.token = argObj.token
			// 将更新后的token持久化存储到本地
			uni.setStorageSync('token', state.token)
		},

		// 定义更新userInfo的mutation
		updateUserInfo(state, argObj) {
			state.userInfo = argObj
			// 将更新后的userInfo对象持久化存储到本地
			uni.setStorageSync('userInfo', JSON.stringify(state.userInfo))
		},

		// 定义更新redirectInfo的mutation
		updateRedirectInfo(state, argObj) {
			state.redirectInfo = argObj
		},

		// 定义my-settle组件结算按钮，调用my-address组件的弹出层点击事件的mutation
		popupAddress(state,argObj) {
			state.isPopup = argObj
		}

	},

	// 模块getters
	getters: {
		showSelected(state) {
			// 根据用户已选中地址输出简短地址内容
			return state.selectedAddress.detailInfo
		}
	}
}
